package advance.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 获取类信息
 */
public class ClassUtil {

    /**
     * 打印类的信息，包括类的成员函数，成员变量
     */
    public static void getMethodsInfo(Object object) {
        // 要获取类的信息，首先要获取类的类类型
        Class c = object.getClass();
        System.out.println(c.getName());// 获取类名称
        /**
         * 获取类方法
         * Method 类，方法对象
         * 一个成员方法就是一个 Method 对象
         * getMethods() 方法获取的是所有的public的函数，包括父类继承而来的
         * getDeclaredMethods() 方法获取的是所有该类自己声明的方法，不问访问权限，不包括父类继承的方法
         */
        Method[] ms = c.getDeclaredMethods();
        // Method[] ms2 = c.getDeclaredMethods();
        for (int i = 0; i < ms.length; i++) {
            // 获取方法的返回值类型的类类型
            Class returnType = ms[i].getReturnType();
            System.out.print(returnType.getName() + " ");
            // 获取方法的名称
            System.out.print(ms[i].getName() + "(");
            // 获取方法参数类型 --> 获得是参数列表的类型的类类型
            Class[] paramTypes = ms[i].getParameterTypes();
            for (Class c1 : paramTypes) {
                System.out.print(c1.getName() + ",");
            }
            System.out.println(")");
        }
    }

    public static void getFieldInfo(Object obj) {
        Class c = obj.getClass();
        Field[] fs = c.getDeclaredFields();
        for (Field f : fs) {
            // 获得成员变量的类类型
            Class fieldType = f.getType();
            String typeName = fieldType.getName();
            // 获得成员变量的名称
            String fieldName = f.getName();
            System.out.println(typeName + " " + fieldName);
        }
    }

    public static void getConstructorInfo(Object obj) {
        Class c = obj.getClass();
        Constructor[] constructors = c.getDeclaredConstructors();
        for(Constructor con :constructors) {
            System.out.print(con.getName() + "(");
            Class[] paramTypes = con.getParameterTypes();
            for (Class class1 : paramTypes) {
                System.out.print(class1.getName() + ",");
            }
            System.out.println(")");
        }
    }

    public static void main(String[] args) {
        Word w = new Word();
        //ClassUtil.getMethodsInfo(w);
        //ClassUtil.getFieldInfo(new Integer(1));
        ClassUtil.getConstructorInfo("Hello");
    }
}
